home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 10
/
AACD 10.iso
/
AACD
/
Programming
/
mpatrol
/
include
/
mpatrol.h
Wrap
C/C++ Source or Header
|
2000-05-16
|
16KB
|
519 lines
#ifndef MP_MPATROL_H
#define MP_MPATROL_H
/*
* mpatrol
* A library for controlling and tracing dynamic memory allocations.
* Copyright (C) 1997-2000 Graeme S. Roy <graeme@epc.co.uk>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307, USA.
*/
#include <stdlib.h>
#include <string.h>
/* The version of the mpatrol library. The version is of the format vrrff,
* where v represents the version number, rr represents the revision number
* and ff represents the bug fix count.
*/
#define MPATROL_VERSION 10200
/* A macro for representing constant function parameters.
*/
#ifndef MP_CONST
#ifdef __STDC__
#define MP_CONST const
#else /* __STDC__ */
#define MP_CONST
#endif /* __STDC__ */
#endif /* MP_CONST */
/* A macro for determining the current function name.
*/
#ifndef MP_FUNCNAME
#ifdef __GNUC__
#define MP_FUNCNAME __PRETTY_FUNCTION__
#else /* __GNUC__ */
#define MP_FUNCNAME NULL
#endif /* __GNUC__ */
#endif /* MP_FUNCNAME */
/* A macro for disabling the definition of replacement C++ operators.
*/
#ifndef MP_NOCPLUSPLUS
#define MP_NOCPLUSPLUS 0
#endif /* MP_NOCPLUSPLUS */
/* Options for backwards compatibility with other versions of mallopt(). They
* are all currently ignored as they have no meaning when used with mpatrol.
*/
#ifdef M_MXFAST
#undef M_MXFAST
#endif /* M_MXFAST */
#ifdef M_NLBLKS
#undef M_NLBLKS
#endif /* M_NLBLKS */
#ifdef M_GRAIN
#undef M_GRAIN
#endif /* M_GRAIN */
#ifdef M_KEEP
#undef M_KEEP
#endif /* M_KEEP */
#define M_MXFAST 1
#define M_NLBLKS 2
#define M_GRAIN 3
#define M_KEEP 4
/* Options that can be set using mallopt(). They all correspond to their
* environment variable option equivalent except for MP_OPT_SETFLAGS and
* MP_OPT_UNSETFLAGS.
*/
#define MP_OPT_HELP 0
#define MP_OPT_SETFLAGS -1
#define MP_OPT_UNSETFLAGS -2
#define MP_OPT_ALLOCSTOP -3
#define MP_OPT_REALLOCSTOP -4
#define MP_OPT_FREESTOP -5
#define MP_OPT_ALLOCBYTE -6
#define MP_OPT_FREEBYTE -7
#define MP_OPT_OFLOWBYTE -8
#define MP_OPT_OFLOWSIZE -9
#define MP_OPT_DEFALIGN -10
#define MP_OPT_LIMIT -11
#define MP_OPT_FAILFREQ -12
#define MP_OPT_FAILSEED -13
#define MP_OPT_UNFREEDABORT -14
#define MP_OPT_LOGFILE -15
#define MP_OPT_PROFFILE -16
#define MP_OPT_PROGFILE -17
#define MP_OPT_AUTOSAVE -18
#define MP_OPT_CHECK -19
#define MP_OPT_SMALLBOUND -20
#define MP_OPT_MEDIUMBOUND -21
#define MP_OPT_LARGEBOUND -22
/* Flags that can be set or unset using mallopt() and MP_OPT_SETFLAGS or
* MP_OPT_UNSETFLAGS respectively. They all correspond to their environment
* variable option equivalent except for MP_FLG_PAGEALLOC and MP_FLG_ALLOCUPPER.
*/
#define MP_FLG_SHOWALL (MP_FLG_SHOWMAP | MP_FLG_SHOWSYMBOLS | \
MP_FLG_SHOWFREED | MP_FLG_SHOWUNFREED)
#define MP_FLG_SHOWMAP 0x00000001
#define MP_FLG_SHOWSYMBOLS 0x00000002
#define MP_FLG_SHOWFREED 0x00000004
#define MP_FLG_SHOWUNFREED 0x00000008
#define MP_FLG_LOGALL (MP_FLG_LOGALLOCS | MP_FLG_LOGREALLOCS | \
MP_FLG_LOGFREES | MP_FLG_LOGMEMORY)
#define MP_FLG_LOGALLOCS 0x00000010
#define MP_FLG_LOGREALLOCS 0x00000020
#define MP_FLG_LOGFREES 0x00000040
#define MP_FLG_LOGMEMORY 0x00000080
#define MP_FLG_CHECKALL (MP_FLG_CHECKALLOCS | MP_FLG_CHECKREALLOCS | \
MP_FLG_CHECKFREES)
#define MP_FLG_CHECKALLOCS 0x00000100
#define MP_FLG_CHECKREALLOCS 0x00000200
#define MP_FLG_CHECKFREES 0x00000400
#define MP_FLG_PROF 0x00000800
#define MP_FLG_SAFESIGNALS 0x00001000
#define MP_FLG_NOPROTECT 0x00002000
#define MP_FLG_NOFREE 0x00004000
#define MP_FLG_PRESERVE 0x00008000
#define MP_FLG_OFLOWWATCH 0x00010000
#define MP_FLG_PAGEALLOC 0x00020000
#define MP_FLG_ALLOCUPPER 0x00040000
#define MP_FLG_USEMMAP 0x00080000
#define MP_FLG_USEDEBUG 0x00100000
#define MP_FLG_ALLOWOFLOW 0x00200000
/* The different types of memory allocation and operation functions.
*/
typedef enum __mp_alloctype
{
MP_AT_MALLOC, /* malloc() */
MP_AT_CALLOC, /* calloc() */
MP_AT_MEMALIGN, /* memalign() */
MP_AT_VALLOC, /* valloc() */
MP_AT_PVALLOC, /* pvalloc() */
MP_AT_STRDUP, /* strdup() */
MP_AT_STRNDUP, /* strndup() */
MP_AT_STRSAVE, /* strsave() */
MP_AT_STRNSAVE, /* strnsave() */
MP_AT_REALLOC, /* realloc() */
MP_AT_RECALLOC, /* recalloc() */
MP_AT_EXPAND, /* expand() */
MP_AT_FREE, /* free() */
MP_AT_CFREE, /* cfree() */
MP_AT_NEW, /* operator new */
MP_AT_NEWVEC, /* operator new[] */
MP_AT_DELETE, /* operator delete */
MP_AT_DELETEVEC, /* operator delete[] */
MP_AT_MEMSET, /* memset() */
MP_AT_BZERO, /* bzero() */
MP_AT_MEMCCPY, /* memccpy() */
MP_AT_MEMCPY, /* memcpy() */
MP_AT_MEMMOVE, /* memmove() */
MP_AT_BCOPY, /* bcopy() */
MP_AT_MEMCHR, /* memchr() */
MP_AT_MEMMEM, /* memmem() */
MP_AT_MEMCMP, /* memcmp() */
MP_AT_BCMP, /* bcmp() */
MP_AT_MAX
}
__mp_alloctype;
/* The details of a single function in a call stack.
*/
typedef struct __mp_allocstack
{
struct __mp_allocstack *next; /* next address node in call stack */
char *name; /* name of function */
void *addr; /* return address in function */
}
__mp_allocstack;
/* The details of a single memory allocation.
*/
typedef struct __mp_allocinfo
{
void *block; /* pointer to block of memory */
size_t size; /* size of block of memory */
__mp_alloctype type; /* type of memory allocation */
unsigned long alloc; /* allocation index */
unsigned long realloc; /* reallocation index */
unsigned long thread; /* thread identifier */
char *func; /* calling function name */
char *file; /* file name in which call took place */
unsigned long line; /* line number at which call took place */
__mp_allocstack *stack; /* call stack details */
char freed; /* allocation has been freed */
}
__mp_allocinfo;
#ifndef NDEBUG
#ifdef malloc
#undef malloc
#endif /* malloc */
#ifdef calloc
#undef calloc
#endif /* calloc */
#ifdef memalign
#undef memalign
#endif /* memalign */
#ifdef valloc
#undef valloc
#endif /* valloc */
#ifdef pvalloc
#undef pvalloc
#endif /* pvalloc */
#ifdef strdup
#undef strdup
#endif /* strdup */
#ifdef strndup
#undef strndup
#endif /* strndup */
#ifdef strsave
#undef strsave
#endif /* strsave */
#ifdef strnsave
#undef strnsave
#endif /* strnsave */
#ifdef realloc
#undef realloc
#endif /* realloc */
#ifdef recalloc
#undef recalloc
#endif /* recalloc */
#ifdef expand
#undef expand
#endif /* expand */
#ifdef free
#undef free
#endif /* free */
#ifdef cfree
#undef cfree
#endif /* cfree */
#ifdef memset
#undef memset
#endif /* memset */
#ifdef bzero
#undef bzero
#endif /* bzero */
#ifdef memccpy
#undef memccpy
#endif /* memccpy */
#ifdef memcpy
#undef memcpy
#endif /* memcpy */
#ifdef memmove
#undef memmove
#endif /* memmove */
#ifdef bcopy
#undef bcopy
#endif /* bcopy */
#ifdef memchr
#undef memchr
#endif /* memchr */
#ifdef memmem
#undef memmem
#endif /* memmem */
#ifdef memcmp
#undef memcmp
#endif /* memcmp */
#ifdef bcmp
#undef bcmp
#endif /* bcmp */
#if !MP_NOCPLUSPLUS
#ifdef __cplusplus
#ifdef new
#undef new
#endif /* new */
#ifdef delete
#undef delete
#endif /* delete */
#endif /* __cplusplus */
#endif /* MP_NOCPLUSPLUS */
#define malloc(l) __mp_alloc((l), 0, MP_AT_MALLOC, MP_FUNCNAME, __FILE__, \
__LINE__, 0)
#define calloc(l, n) __mp_alloc((l) * (n), 0, MP_AT_CALLOC, MP_FUNCNAME, \
__FILE__, __LINE__, 0)
#define memalign(a, l) __mp_alloc((l), (a), MP_AT_MEMALIGN, MP_FUNCNAME, \
__FILE__, __LINE__, 0)
#define valloc(l) __mp_alloc((l), 0, MP_AT_VALLOC, MP_FUNCNAME, __FILE__, \
__LINE__, 0)
#define pvalloc(l) __mp_alloc((l), 0, MP_AT_PVALLOC, MP_FUNCNAME, __FILE__, \
__LINE__, 0)
#define strdup(p) __mp_strdup((p), 0, MP_AT_STRDUP, MP_FUNCNAME, __FILE__, \
__LINE__, 0)
#define strndup(p, l) __mp_strdup((p), (l), MP_AT_STRNDUP, MP_FUNCNAME, \
__FILE__, __LINE__, 0)
#define strsave(p) __mp_strdup((p), 0, MP_AT_STRSAVE, MP_FUNCNAME, __FILE__, \
__LINE__, 0)
#define strnsave(p, l) __mp_strdup((p), (l), MP_AT_STRNSAVE, MP_FUNCNAME, \
__FILE__, __LINE__, 0)
#define realloc(p, l) __mp_realloc((p), (l), 0, MP_AT_REALLOC, MP_FUNCNAME, \
__FILE__, __LINE__, 0)
#define recalloc(p, l, n) __mp_realloc((p), (l) * (n), 0, MP_AT_RECALLOC, \
MP_FUNCNAME, __FILE__, __LINE__, 0)
#define expand(p, l) __mp_realloc((p), (l), 0, MP_AT_EXPAND, MP_FUNCNAME, \
__FILE__, __LINE__, 0)
#define free(p) __mp_free((p), MP_AT_FREE, MP_FUNCNAME, __FILE__, __LINE__, 0)
#define cfree(p, l, n) __mp_free((p), MP_AT_CFREE, MP_FUNCNAME, __FILE__, \
__LINE__, 0)
#define memset(p, c, l) __mp_setmem((p), (l), (unsigned char) (c), \
MP_AT_MEMSET, MP_FUNCNAME, __FILE__, \
__LINE__, 0)
#define bzero(p, l) (void) __mp_setmem((p), (l), 0, MP_AT_BZERO, MP_FUNCNAME, \
__FILE__, __LINE__, 0)
#define memccpy(q, p, c, l) __mp_copymem((p), (q), (l), (unsigned char) (c), \
MP_AT_MEMCCPY, MP_FUNCNAME, __FILE__, \
__LINE__, 0)
#define memcpy(q, p, l) __mp_copymem((p), (q), (l), 0, MP_AT_MEMCPY, \
MP_FUNCNAME, __FILE__, __LINE__, 0)
#define memmove(q, p, l) __mp_copymem((p), (q), (l), 0, MP_AT_MEMMOVE, \
MP_FUNCNAME, __FILE__, __LINE__, 0)
#define bcopy(p, q, l) (void) __mp_copymem((p), (q), (l), 0, MP_AT_BCOPY, \
MP_FUNCNAME, __FILE__, __LINE__, 0)
#define memchr(p, c, l) __mp_locatemem((p), (l), NULL, (size_t) (c), \
MP_AT_MEMCHR, MP_FUNCNAME, __FILE__, \
__LINE__, 0)
#define memmem(p, l, q, m) __mp_locatemem((p), (l), (q), (m), MP_AT_MEMMEM, \
MP_FUNCNAME, __FILE__, __LINE__, 0)
#define memcmp(p, q, l) __mp_comparemem((p), (q), (l), MP_AT_MEMCMP, \
MP_FUNCNAME, __FILE__, __LINE__, 0)
#define bcmp(p, q, l) __mp_comparemem((p), (q), (l), MP_AT_BCMP, MP_FUNCNAME, \
__FILE__, __LINE__, 0)
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
void __mp_init(void);
void __mp_fini(void);
void *__mp_alloc(size_t, size_t, __mp_alloctype, MP_CONST char *,
MP_CONST char *, unsigned long, size_t);
char *__mp_strdup(MP_CONST char *, size_t, __mp_alloctype, MP_CONST char *,
MP_CONST char *, unsigned long, size_t);
void *__mp_realloc(void *, size_t, size_t, __mp_alloctype, MP_CONST char *,
MP_CONST char *, unsigned long, size_t);
void __mp_free(void *, __mp_alloctype, MP_CONST char *, MP_CONST char *,
unsigned long, size_t);
void *__mp_setmem(void *, size_t, unsigned char, __mp_alloctype,
MP_CONST char *, MP_CONST char *, unsigned long, size_t);
void *__mp_copymem(MP_CONST void *, void *, size_t, unsigned char,
__mp_alloctype, MP_CONST char *, MP_CONST char *,
unsigned long, size_t);
void *__mp_locatemem(MP_CONST void *, size_t, MP_CONST void *, size_t,
__mp_alloctype, MP_CONST char *, MP_CONST char *,
unsigned long, size_t);
int __mp_comparemem(MP_CONST void *, MP_CONST void *, size_t, __mp_alloctype,
MP_CONST char *, MP_CONST char *, unsigned long, size_t);
int __mp_info(MP_CONST void *, __mp_allocinfo *);
int __mp_printinfo(MP_CONST void *);
void __mp_memorymap(int);
void __mp_summary(void);
void __mp_check(void);
void (*__mp_prologue(void (*)(MP_CONST void *, size_t)))
(MP_CONST void *, size_t);
void (*__mp_epilogue(void (*)(MP_CONST void *)))(MP_CONST void *);
void (*__mp_nomemory(void (*)(void)))(void);
void __mp_pushdelstack(MP_CONST char *, MP_CONST char *, unsigned long);
void __mp_popdelstack(char **, char **, unsigned long *);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#else /* NDEBUG */
#define __mp_init() ((void) 0)
#define __mp_fini() ((void) 0)
#define __mp_alloc(l, a, f, s, t, u, k) ((void *) NULL)
#define __mp_strdup(p, l, f, s, t, u, k) ((char *) NULL)
#define __mp_realloc(p, l, a, f, s, t, u, k) ((void *) NULL)
#define __mp_free(p, f, s, t, u, k) ((void) 0)
#define __mp_setmem(p, l, c, f, s, t, u, k) ((void *) NULL)
#define __mp_copymem(p, q, l, c, f, s, t, u, k) ((void *) NULL)
#define __mp_locatemem(p, l, q, m, f, s, t, u, k) ((void *) NULL)
#define __mp_comparemem(p, q, l, f, s, t, u, k) ((int) 0)
#define __mp_info(p, d) ((int) 0)
#define __mp_printinfo(p) ((int) 0)
#define __mp_memorymap(s) ((void) 0)
#define __mp_summary() ((void) 0)
#define __mp_check() ((void) 0)
#define __mp_prologue(h) ((void (*)(MP_CONST void *, size_t)) NULL)
#define __mp_epilogue(h) ((void (*)(MP_CONST void *)) NULL)
#define __mp_nomemory(h) ((void (*)(void)) NULL)
#define __mp_pushdelstack(s, t, u) ((void) 0)
#define __mp_popdelstack(s, t, u) ((void) 0)
#endif /* NDEBUG */
#if !MP_NOCPLUSPLUS
#ifdef __cplusplus
#ifndef NDEBUG
typedef void (*new_handler)(void);
#ifdef __GNUC__
extern "C"
{
#endif /* __GNUC__ */
/* Set the low-memory handler.
*/
static inline new_handler set_new_handler(new_handler h)
{
return __mp_nomemory(h);
}
#ifdef __GNUC__
}
#endif /* __GNUC__ */
/* Override operator new.
*/
static inline void *operator new(size_t l, MP_CONST char *s, MP_CONST char *t,
unsigned long u)
{
return __mp_alloc(l, 0, MP_AT_NEW, s, t, u, 0);
}
/* Override operator new[].
*/
static inline void *operator new[](size_t l, MP_CONST char *s, MP_CONST char *t,
unsigned long u)
{
return __mp_alloc(l, 0, MP_AT_NEWVEC, s, t, u, 0);
}
/* Override operator delete.
*/
static inline void operator delete(void *p)
{
char *s, *t;
unsigned long u;
__mp_popdelstack(&s, &t, &u);
__mp_free(p, MP_AT_DELETE, s, t, u, 0);
}
/* Override operator delete[].
*/
static inline void operator delete[](void *p)
{
char *s, *t;
unsigned long u;
__mp_popdelstack(&s, &t, &u);
__mp_free(p, MP_AT_DELETEVEC, s, t, u, 0);
}
#define new ::new(MP_FUNCNAME, __FILE__, __LINE__)
#define delete __mp_pushdelstack(MP_FUNCNAME, __FILE__, __LINE__), ::delete
#endif /* NDEBUG */
#endif /* __cplusplus */
#endif /* MP_NOCPLUSPLUS */
#endif /* MP_MPATROL_H */